package com.feifan.dao;

import com.feifan.db.DataBase;
import com.feifan.vo.User;

import javax.servlet.RequestDispatcher;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

public class UserDao  implements IUserDao{
    private Connection connection= DataBase.getConnection();//先通过Connection进行对数据库的连接
    @Override
    public List<User> show() {
        List<User> list=new ArrayList<>();
        PreparedStatement pre=null;
        ResultSet res=null;
        try {
            pre=connection.prepareStatement("select * from person order by id desc");
            res=pre.executeQuery();
            while (res.next()){
                list.add(new User(res.getInt("id"),res.getString("username"),res.getString("password")));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        finally {

            if (res != null) {
                try {
                    res.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (pre != null) {
                try {
                    pre.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
//        DataBase.closeConnection(); ***后端和前端之间多次传数据的时候，千万千万不要在这期间关掉数据库的连接！！！！
        return list;
    }

    @Override
    public boolean delete(int id) {//id为主键
        PreparedStatement pre=null;

        try {
            pre=connection.prepareStatement ("delete from person where id=?");
            pre.setInt(1,id);
            return pre.executeUpdate()>0?true:false;//改完更新一下
        } catch (SQLException e) {
            e.printStackTrace();
        }
        finally {

            if (pre != null) {
                try {
                    pre.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
//        DataBase.closeConnection(); ***后端和前端之间多次传数据的时候，千万千万不要在这期间关掉数据库的连接！！！！
        return false;
    }

    @Override
    public boolean add(User user) {//包含增加新数据and修改老数据两个方面
        PreparedStatement pre=null;
        try {
            pre=connection.prepareStatement("replace into person(id,username,password) values(?,?,?);");//replace既可以进行新数据的增添，又可以进行就数据的修改
            pre.setString(1,null);//默认为增加新的数据
            if(user.getId()!=null){//为修改旧数据
                pre.setInt(1,user.getId());
            }
            pre.setString(2,user.getUsername());
            pre.setString(3,user.getPassword());
            return pre.executeUpdate()>0?true:false;
        } catch (SQLException e) {
            e.printStackTrace();
        }
        finally {
            if (pre != null) {
                try {
                    pre.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
//        DataBase.closeConnection(); ***后端和前端之间多次传数据的时候，千万千万不要在这期间关掉数据库的连接！！！！
        return false;
    }

    @Override
    public User update(int id) {
        User user=new User();
        PreparedStatement pre=null;
        ResultSet res=null;
        try {
            pre=connection.prepareStatement("select * from person where id=?");
            pre.setInt(1,id);
            res=pre.executeQuery();
            if(res.next()){//如果有数据的话
                //把得到的数据放到user对象中
                user.setId(res.getInt("id"));
                user.setUsername(res.getString("username"));
                user.setPassword(res.getString("password"));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        finally{
            if(pre!=null){
                try {
                    pre.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(res!=null){
                try {
                    res.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
//        DataBase.closeConnection(); ***后端和前端之间多次传数据的时候，千万千万不要在这期间关掉数据库的连接！！！！
        return user;
    }
}
